package gradle.common.feign.config;

import feign.Feign;
import feign.Request;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.autoconfigure.AutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

/**
 * timeout hierarchy:
 * <p>
 * Resilience4j 的 timeout-duration 必须小于 Feign 的 readTimeout 和 connectTimeout。
 * 避免 Feign 在 Resilience4j 超时之前终止请求。
 * 统一配置管理：
 * <p>
 * 建议配置关系
 * Feign 连接和读取超时：
 * connectTimeout：稍微大于 Resilience4j 的 timeout-duration，避免连接未建立就被熔断。
 * readTimeout：比 timeout-duration 稍微长，确保请求能在规定的读取时间内完成。
 * 例如：
 * Resilience4j 的 timeout-duration = 3s；
 * Feign 的 connectTimeout = 4s，readTimeout = 5s。
 * <p>
 * 使用 Spring Profiles 或动态配置加载，确保 Feign 和 Resilience4j 的超时设置可控且一致。
 */
@AutoConfiguration
@ConditionalOnClass(Feign.class)
public class FeignOptionsConfiguration {

    @Value("${spring.cloud.openfeign.httpclient.ok-http.feign-read-time:5}")
    private int connectTimeout;

    @Value("${spring.cloud.openfeign.httpclient.ok-http.feign-connect-timeout:60}")
    private int readTimeout;

    @Bean
    public Request.Options feignOptions() {
        return new Request.Options(connectTimeout, TimeUnit.SECONDS, readTimeout, TimeUnit.SECONDS, true);
    }

}